import * as vscode from 'vscode';
import {dedent} from "../../../utils";

// documentation中使用了代码块，代码块中写的事makedown格式，首行不能为空
let actionItems = [
    {
        "label": "runAction",
        "insertText": dedent`
        GUI:runAction(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 播放动作
        ## runAction(widget, value)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | obj  | 动作内容 |
        `
    },
    {
        "label": "getActionByTag",
        "insertText": dedent`
        GUI:getActionByTag(\${1:widget}, \${2:tag})
        `,
        "documentation": dedent`## getActionByTag(widget, tag)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | tag    | 是   | int  | 动作标记 |

        — 通过标记获取动作内容
        `
    },
    {
        "label": "stopAllActions",
        "insertText": dedent`
        GUI:stopAllActions(\${1:widget})
        `,
        "documentation": dedent`# 停止所有动作
        ## stopAllActions(widget)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        `
    },
    {
        "label": "stopActionByTag",
        "insertText": dedent`
        GUI:stopActionByTag(\${1:widget}, \${2:tag})
        `,
        "documentation": dedent`## stopActionByTag(widget, tag)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | tag    | 是   | int  | 动作标记 |

        — 通过标记停止动作
        `
    },
    {
        "label": "ActionMoveTo",
        "insertText": dedent`
        GUI:ActionMoveTo(\${1:time}, \${2:x}, \${3:y})
        `,
        "documentation": dedent`# 移动
        ## ActionMoveTo(time, x, y)

        | 参数 | 必选 | 类型 | 注释        |
        | :--- | :--- | :--- | :---------- |
        | time | 是   | int  | 时间        |
        | x    | 是   | int  | 位置 横坐标 |
        | y    | 是   | int  | 位置 纵坐标 |

        - 移动到B点：以世界坐标系为原点(0,0)
        `
    },
    {
        "label": "ActionMoveBy",
        "insertText": dedent`
        GUI:ActionMoveBy(\${1:time}, \${2:x}, \${3:y})
        `,
        "documentation": dedent`## ActionMoveBy(time, x, y)

        | 参数 | 必选 | 类型 | 注释        |
        | :--- | :--- | :--- | :---------- |
        | time | 是   | int  | 时间        |
        | x    | 是   | int  | 位置 横坐标 |
        | y    | 是   | int  | 位置 纵坐标 |

        - A点移动到B点 移动相对位置：以A点为原点(0,0)
        `
    },
    {
        "label": "ActionScaleTo",
        "insertText": dedent`
        GUI:ActionScaleTo(\${1:time}, \${2:ratio}, \${3:...})
        `,
        "documentation": dedent`# 缩放
        ## ActionScaleTo(time, ratio, …)

        | 参数  | 必选 | 类型 | 注释               |
        | :---- | :--- | :--- | :----------------- |
        | time  | 是   | int  | 时间               |
        | ratio | 是   | int  | 缩放比例（百分比） |

        - 放大或缩小到某一比例
        - 有第三个参数时, 后两位参数分别表示X轴缩放比、Y轴缩放比 **3.40.8版本新增**
        `
    },
    {
        "label": "ActionScaleBy",
        "insertText": dedent`
        GUI:ActionScaleBy(\${1:time}, \${2:ratio}, \${3:...})
        `,
        "documentation": dedent`## ActionScaleBy(time, ratio, …)

        | 参数  | 必选 | 类型 | 注释               |
        | :---- | :--- | :--- | :----------------- |
        | time  | 是   | int  | 时间               |
        | ratio | 是   | int  | 缩放比例（百分比） |

        - 放大或缩小到原来的某一比例
        - 有第三个参数时, 后两位参数分别表示X轴缩放比、Y轴缩放比 **3.40.8版本新增**
        `
    },
    {
        "label": "ActionRotateTo",
        "insertText": dedent`
        GUI:ActionRotateTo(\${1:time}, \${2:angle})
        `,
        "documentation": dedent`# 旋转
        ## ActionRotateTo(time, angle)

        | 参数  | 必选 | 类型 | 注释     |
        | :---- | :--- | :--- | :------- |
        | time  | 是   | int  | 时间     |
        | angle | 是   | int  | 旋转角度 |

        - 旋转到多少角度
        `
    },
    {
        "label": "ActionRotateBy",
        "insertText": dedent`
        GUI:ActionRotateBy(\${1:time}, \${2:angle})
        `,
        "documentation": dedent`## ActionRotateBy(time, angle)

        | 参数  | 必选 | 类型 | 注释     |
        | :---- | :--- | :--- | :------- |
        | time  | 是   | int  | 时间     |
        | angle | 是   | int  | 旋转角度 |

        - 旋转到原来的多少角度
        `
    },
    {
        "label": "ActionFadeIn",
        "insertText": dedent`
        GUI:ActionFadeIn(\${1:time})
        `,
        "documentation": dedent`# 淡入淡出
        ## ActionFadeIn(time)

        | 参数 | 必选 | 类型 | 注释 |
        | :--- | :--- | :--- | :--- |
        | time | 是   | int  | 时间 |

        - 淡入
        `
    },
    {
        "label": "ActionFadeOut",
        "insertText": dedent`
        GUI:ActionFadeOut(\${1:time})
        `,
        "documentation": dedent`## ActionFadeOut(time)

        | 参数 | 必选 | 类型 | 注释 |
        | :--- | :--- | :--- | :--- |
        | time | 是   | int  | 时间 |

        - 淡出
        `
    },
    {
        "label": "ActionBlink",
        "insertText": dedent`
        GUI:ActionBlink(\${1:time}, \${2:num})
        `,
        "documentation": dedent`# 闪烁
        ## ActionBlink(time, num)

        | 参数 | 必选 | 类型 | 注释     |
        | :--- | :--- | :--- | :------- |
        | time | 是   | int  | 时间     |
        | num  | 是   | int  | 闪烁次数 |
        `
    },
    {
        "label": "CallFunc",
        "insertText": dedent`
        GUI:CallFunc(\${1:callback})
        `,
        "documentation": dedent`# 动画回调函数
        ## CallFunc(callback)

        | 参数     | 必选 | 类型     | 注释     |
        | :------- | :--- | :------- | :------- |
        | callback | 是   | function | 回调函数 |
        `
    },
    {
        "label": "DelayTime",
        "insertText": dedent`
        GUI:DelayTime(\${1:time})
        `,
        "documentation": dedent`# 延迟
        ## DelayTime(time)

        | 参数     | 必选 | 类型 | 注释     |
        | :------- | :--- | :--- | :------- |
        | time     | 是   | int  | 延迟时间 |
        `
    },
    {
        "label": "ActionShow",
        "insertText": dedent`
        GUI:ActionShow()
        `,
        "documentation": dedent`# 显示与隐藏
        ## ActionShow()

        - 显示
        `
    },
    {
        "label": "ActionHide",
        "insertText": dedent`
        GUI:ActionHide()
        `,
        "documentation": dedent`## ActionHide()

        - 隐藏
        `
    },
    {
        "label": "ActionRemoveSelf",
        "insertText": dedent`
        GUI:ActionRemoveSelf()
        `,
        "documentation": dedent`# 移除自身
        ## ActionRemoveSelf()
        `
    },
    {
        "label": "ActionSequence",
        "insertText": dedent`
        GUI:ActionSequence(\${1:action}, \${2:...})
        `,
        "documentation": dedent`# 播放顺序
        ## ActionSequence(action, …) 多个动作顺序播放

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |

        *示例 :*
        \`\`\`
        local function callback()
            SL:Print("_____")
        end
        GUI:runAction(item., GUI:ActionSequence(GUI:ActionScaleTo(0.1, 1.4), GUI:ActionScaleTo(0.1, 1), GUI:CallFunc(callback)))
        \`\`\`
        `
    },
    {
        "label": "ActionSpawn",
        "insertText": dedent`
        GUI:ActionSpawn(\${1:action}, \${2:...})
        `,
        "documentation": dedent`## ActionSpawn(action, …) 多个动作同时播放

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |
        `
    },
    {
        "label": "ActionRepeat",
        "insertText": dedent`
        GUI:ActionRepeat(\${1:action}, \${2:time})
        `,
        "documentation": dedent`# 循环播放
        ## ActionRepeat(action, time)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |
        | time   | 是   | int  | 时间     |
        `
    },
    {
        "label": "ActionRepeatForever",
        "insertText": dedent`
        GUI:ActionRepeatForever(\${1:action})
        `,
        "documentation": dedent`## ActionRepeatForever(action)

        | 参数   | 必选 | 类型 | 注释                 |
        | :----- | :--- | :--- | :------------------- |
        | action | 是   | obj  | 动作对象（一直循环） |
        `
    },
    {
        "label": "ActionEaseBackIn",
        "insertText": dedent`
        GUI:ActionEaseBackIn(\${1:action})
        `,
        "documentation": dedent`# 复合动作
        ## ActionEaseBackIn(action) 加速度向右，反方向缓慢移动

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |
        `
    },
    {
        "label": "ActionEaseBackOut",
        "insertText": dedent`
        GUI:ActionEaseBackOut(\${1:action})
        `,
        "documentation": dedent`## ActionEaseBackOut(action) 快速移动到结束，然后缓慢返回到结束

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |
        `
    },
    {
        "label": "ActionBezierTo",
        "insertText": dedent`
        GUI:ActionBezierTo(\${1:time}, \${2:controlPoint_1}, \${3:controlPoint_2}, \${4:endPosition})
        `,
        "documentation": dedent`# 贝塞尔曲线运动
        ## ActionBezierTo(time, controlPoint_1, controlPoint_2, endPosition)

        | 参数           | 必选 | 类型  | 注释         |
        | :------------- | :--- | :---- | :----------- |
        | time           | 是   | int   | 时间         |
        | controlPoint_1 | 是   | table | 控制点1 坐标 |
        | controlPoint_2 | 是   | table | 控制点2 坐标 |
        | endPosition    | 是   | table | 结束坐标     |

        *示例 :*
        \`\`\`
        local btn = GUI:Button_Create(GUI:Attach_LeftBottom(), "btn1", 200, 200, "res/public/1900000510.png")
        local startPos = GUI:p(200, 200)
        local endPos = GUI:p(600, 200)
        local controlPoint_1 = GUI:p(200, 800)
        local controlPoint_2 = GUI:p(600, 500)
        local endPosition = endPos
        local bezier = GUI:ActionBezierTo(2, controlPoint_1, controlPoint_2, endPosition)
        GUI:runAction(btn, bezier)
        \`\`\`
        `
    },
    {
        "label": "ActionEaseExponentialIn",
        "insertText": dedent`
        GUI:ActionEaseExponentialIn(\${1:action})
        `,
        "documentation": dedent`# 指数缓冲动作
        ## ActionEaseExponentialIn(action) 缓慢开始, 加速结束

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |
        `
    },
    {
        "label": "ActionEaseExponentialOut",
        "insertText": dedent`
        GUI:ActionEaseExponentialOut(\${1:action})
        `,
        "documentation": dedent`## ActionEaseExponentialOut(action) 加速开始, 缓慢结束

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |
        `
    },
    {
        "label": "ActionEaseExponentialInOut",
        "insertText": dedent`
        GUI:ActionEaseExponentialInOut(\${1:action})
        `,
        "documentation": dedent`## ActionEaseExponentialInOut(action) 动作缓慢开始和终止

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | action | 是   | obj  | 动作对象 |
        `
    },
]



export function getCompletionItems(): vscode.CompletionItem[] {


    const completionItems: vscode.CompletionItem[] = [];
    actionItems.forEach((item: any) => {
        completionItems.push(createFunctionCompletionItem(item.label, item.insertText, item.documentation));
    });
    return completionItems;
}

function createFunctionCompletionItem(label: string, insertText: string, documentation?: string): vscode.CompletionItem {
    const item = new vscode.CompletionItem(label, vscode.CompletionItemKind.Function);
    item.insertText = new vscode.SnippetString(insertText);
    if (documentation) {
        item.documentation = new vscode.MarkdownString(documentation);
    }
    return item;
}


